import axios from 'axios'
import {Dialog, Toast} from 'vant'
import store from '@/store'
import {getToken} from '@/utils/auth'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.BASE_API, // api 的 base_url
  timeout: 60000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(
  (config) => {
    // 在发送请求之前做一些事情
    if (store.getters.token) {
      // 让每个请求携带自定义token
      config.headers['token'] = getToken()
    }
    return config
  },
  (error) => {
    // 在请求失败时做一些事情
    console.log(error) // 用于调试
    Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  (response) => {
    console.log(`[${response.config.url}]`, response)
    /**
     * code为非20000是抛错 可结合自己业务进行修改
     */
    const status = response.status
    if (status !== 200 && status !== 201 && status !== 204) {
      Toast({
        message: response.message,
        type: 'fail',
        duration: 5000
      })
      return Promise.reject(new Error('error'))
    } else {
      return response.data
    }
  },
  (error) => {
    console.error(`[${error.config.url}]`, error) // 用于调试

    // 401:非法的token或未授权
    if (error.response && error.response.status === 401) {
      // 401:非法的token或未授权
      Dialog.confirm({
        title: '确定登出',
        message: '您已被登出，可以取消继续留在该页面，或者重新登录',
        confirmButtonText: '重新登录'
      }).then(() => {
        store.dispatch('FedLogOut').then(() => {
          location.reload() // 为了重新实例化vue-router对象 避免bug
        })
      })
    } else {
      let errorMessage = error.message
      if (error.response && error.response.data) {
        errorMessage = error.response.data
      }
      Toast({
        message: errorMessage,
        type: 'fail',
        duration: 5000
      })
      return Promise.reject(error)
    }
  }
)

export default service
